Skip to content

chore: integrate 10 pending PRs (#114 #115 #150 #153 #154 #156 #158 #164 #166 #176) - #181

Merged
Gucc111 merged 26 commits into
OpenBMB:mainfrom
Gucc111:integrate/merge-batch
Jun 8, 2026
Merged

chore: integrate 10 pending PRs (#114 #115 #150 #153 #154 #156 #158 #164 #166 #176)#181
Gucc111 merged 26 commits into
OpenBMB:mainfrom
Gucc111:integrate/merge-batch

Conversation

@Gucc111

@Gucc111 Gucc111 commented Jun 8, 2026

Copy link
Copy Markdown
Collaborator

Summary

Integrates the following 10 PRs into main in a tested merge order:

  1. fix(read_file): normalize empty pages string to prevent validation loop #114 — fix(read_file): normalize empty pages string to prevent validation loop
  2. fix(config): deep-compare arrays in config diff to eliminate reload false-positives #154 — fix(config): deep-compare arrays in config diff to eliminate reload false-positives
  3. fix(always-on): clear activeWorkCycleId from state after archive/apply #164 — fix(always-on): clear activeWorkCycleId from state after archive/apply
  4. fix(mcp): browser-use screenshot saving path and inline rendering #166 — fix(mcp): browser-use screenshot saving path and inline rendering
  5. feat(always-on): add maxPlansPerCycle config to cap plans per work cycle #115 — feat(always-on): add maxPlansPerCycle config to cap plans per work cycle
  6. fix(always-on): extract report from LLM text when report tool is not invoked #153 — fix(always-on): extract report from LLM text when report tool is not invoked
  7. fix(ui): add missing Always-On phase entries to prevent fallback to Discovery Started #156 — fix(ui): add missing Always-On phase entries to prevent fallback to Discovery Started
  8. [codex] Update Always-On event badge behavior #176 — [codex] Update Always-On event badge behavior
  9. feat(telemetry): add UI toggle and YAML-driven hot-reload for telemetry #150 — feat(telemetry): add UI toggle and YAML-driven hot-reload for telemetry
  10. fix(proxy): bypass localhost, promote to top-level config, and fix race condition #158 — fix(proxy): bypass localhost, promote to top-level config, and fix race condition

Merge conflict resolution

Test plan

Supersedes: #114, #115, #150, #153, #154, #156, #158, #164, #166, #176

Made with Cursor

Gucc111 and others added 26 commits June 2, 2026 18:37
When some models/providers emit `pages: ""` instead of omitting the
field, parsePdfPageRange rejects it and triggers invalid_tool_input.
After 3 consecutive failures the agent_tool_error_loop circuit breaker
terminates the session.

Treat blank pages values the same as omitted before validation runs.

Closes OpenBMB#108

Co-authored-by: Cursor <cursoragent@cursor.com>
Block new discovery fires when the active cycle reaches the configured
plan limit (default 3). The system resumes automatically after the user
applies or archives the cycle.

Co-authored-by: Cursor <cursoragent@cursor.com>
…ings UI

Wire a top-level `telemetry: { enabled: false }` field in
pilotdeck.yaml so the analytics opt-in can be controlled from the
Web UI Settings > Advanced section instead of raw env vars.

Co-authored-by: Cursor <cursoragent@cursor.com>
…ale YAML

updateRaw now writes rawRef.current synchronously so that callers
who invoke setRaw + save in the same event loop (e.g. the telemetry
toggle) no longer race against React's batched re-render.

Co-authored-by: Cursor <cursoragent@cursor.com>
Replace the env-var-based ANALYTICS_ENABLED mapping with a direct
YAML config path: gateway now parses telemetry.enabled from the
config snapshot and subscribes to config changes via configStore.

- Add setEnabled() to TelemetryClient/TelemetrySender for runtime
  enable/disable (starts/stops the flush timer accordingly)
- Parse telemetry section in loadPilotConfig and add to PilotConfig
- Pass initial enabled value from config snapshot in pilotdeck.ts
- Subscribe to telemetry.* changes for hot-reload
- Remove ANALYTICS_ENABLED env var mapping from buildRuntimeEnv

Co-authored-by: Cursor <cursoragent@cursor.com>
…invoked (OpenBMB#148)

When the report-phase agent produces text but does not call
always_on_report, the run was incorrectly marked as failed with
reason "report_tool_not_invoked". Now the runtime extracts
assistant_text_delta events, runs them through parseReportMarkdown,
and persists the result — so the outcome reflects the actual
execution success rather than a missed tool call.

Co-authored-by: Cursor <cursoragent@cursor.com>
…alse-positives (OpenBMB#147)

diffValues treated arrays as leaf values and compared them by reference
(Object.is), so every reload created new array instances that were
always reported as changed. This caused spurious runtime invalidation
and always-on stop/start cycles. Add recursive element-wise comparison
for arrays alongside the existing object diff logic.

Co-authored-by: Cursor <cursoragent@cursor.com>
…ort code

Replace undici ProxyAgent with EnvHttpProxyAgent so that NO_PROXY is
respected and 127.0.0.1/localhost are always excluded — the gateway
WebSocket connection must never be routed through an external proxy.

Also fix `require("undici")` → `await import("undici")` in
src/cli/proxy.ts to resolve the ESM "require is not defined" error.

Remove the deprecated local LLM proxy port (18080) infrastructure:
dead functions in index.js, proxyPort config field, ANTHROPIC_BASE_URL
override, CCR sentinel logic, restart-proxy event hook, and the
corresponding UI settings entry.

Closes OpenBMB#149

Co-authored-by: Cursor <cursoragent@cursor.com>
…-reload

Move proxy configuration from webui.runtime.httpsProxy to a top-level
proxy.url / proxy.noProxy field in pilotdeck.yaml so both Gateway and
UI Server share the same proxy setting.

- Add PilotProxyConfig type and parseProxyConfig() with backward-compat
  migration from webui.runtime.httpsProxy
- Classify proxy.* changes as runtime-live for immediate hot-reload
- Add reinstallGlobalProxy() to support runtime proxy updates via
  configStore.subscribe in the Gateway process
- Migrate UI frontend and i18n from httpsProxy to proxy.url/noProxy

Co-authored-by: Cursor <cursoragent@cursor.com>
Use a Promise lock (pendingInstall) so concurrent async callers share
the same in-flight install instead of racing past the `installed` guard
during the dynamic `import("undici")` await gap.

Co-authored-by: Cursor <cursoragent@cursor.com>
…iscovery Started

PHASE_META and AlwaysOnDashboardEventPhase were missing workspace_started,
report_started, apply_started, and apply_completed — causing those events
to fall back to the discovery_started icon/label in the Dashboard.

Also fix runningCount double-counting the same runId when multiple start
phases exist without a terminal phase.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
clearActiveWorkCycleId was defined but never called, leaving a stale
reference in state.json after a cycle was archived or applied. Call it
in DiscoveryPlanService.archiveCycle() and updateCycleExecution() via
a new optional StateManager dependency, keeping backward compatibility.

Co-authored-by: Cursor <cursoragent@cursor.com>
… as inline images

The browser-use MCP process inherited an unpredictable CWD from the
parent PilotDeck process, so screenshots saved with a user-specified
`filename` parameter ended up in the wrong directory. Set `cwd: outDir`
on the per-session spec so both auto-generated and named screenshots
land in `projectRoot/.pilotdeck/browser_screenshots/<sid>/`.

When @playwright/mcp returns only a text block with a Markdown file
reference (no base64 image block — happens when `filename` is provided),
read the referenced image from disk and inject it as an inline image
block so it renders in the chat UI through the existing toolResultImages
pipeline.

Co-authored-by: Cursor <cursoragent@cursor.com>
…vel config, and fix race condition

Co-authored-by: Cursor <cursoragent@cursor.com>
@Gucc111
Gucc111 merged commit 0869169 into OpenBMB:main Jun 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant